package cn.digiwin.wx.utils;

import cn.digiwin.wx.gzh.common.WeixinGzhComm;
import cn.digiwin.wx.model.TicketModel;
import cn.digiwin.wx.qyh.common.WeixinComm;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;

/**
 * 获取临时认证票据 for js-sdk
 * <p>
 * create by wenchuan.li on 2018/4/8.
 */
public class TicketUtil {

    protected static Logger logger = LoggerFactory.getLogger(TicketUtil.class);

    protected static TicketModel model = new TicketModel();

    // 公众号
    protected static TicketModel modelGzh = new TicketModel();

    /**
     * 获取企业jsticket。
     * <pre>
     * 1.如果没有初始化则直接从数据库中获取。
     * 2.如果已经初始化。
     * 	1.如果已经过期则重新获取。
     * 	2.从缓存中获取。
     * </pre>
     *
     * @return
     */
    public static synchronized String getJsTicket() {
        //没有初始化直接获取。
        if (!model.isInit()) {
            return getTicket();
        } else {
            //如果token要过期则重新获取。
            if (model.isExpire()) {
                return getTicket();
            } else {
                //从缓存中获取。
                return model.getJsTicket();
            }
        }
    }

    /**
     * 获取ticket。
     *
     * @return
     */
    private static String getTicket() {
        String url = WeixinComm.getWxJsapiTicketUrl();
        String rtn = "";
        try {
            rtn = HttpUtil.sendHttpsRequest(url, "", WeixinComm.METHOD_GET);
            JSONObject result = JSONObject.parseObject(rtn);

            if (result.getInteger("errcode") == 0) {  //取到了
                String ticket = result.getString("ticket");
                int expireIn = result.getInteger("expires_in");
                model.setJsTicket(ticket, expireIn);
                return ticket;
            } else {
                String errMsg = result.getString("errmsg");
                logger.error(errMsg);
                return "-1";
            }
        } catch (KeyManagementException | NoSuchAlgorithmException
                | NoSuchProviderException | IOException e) {
            e.printStackTrace();
        }
        return "-1";
    }

    // 服务号获取ticket
    public static synchronized String getJsTicketGzh() {
        //没有初始化直接获取。
        if (!modelGzh.isInit()) {
            return getTicketGzh();
        } else {
            //如果token要过期则重新获取。
            if (modelGzh.isExpire()) {
                return getTicketGzh();
            } else {
                //从缓存中获取。
                return modelGzh.getJsTicket();
            }
        }
    }

    // 服务号获取ticket
    private static String getTicketGzh() {
        String url = WeixinGzhComm.getWxJsapiTicketUrl();
        String rtn = "";
        try {
            rtn = HttpUtil.sendHttpsRequest(url, "", WeixinGzhComm.METHOD_GET);
            JSONObject result = JSONObject.parseObject(rtn);
            if (result.getInteger("errcode") == 0) {  //取到了
                String ticket = result.getString("ticket");
                int expireIn = result.getInteger("expires_in");
                modelGzh.setJsTicket(ticket, expireIn);
                return ticket;
            } else {
                logger.error(result.getString("errmsg"));
                return "-1";
            }
        } catch (KeyManagementException | NoSuchAlgorithmException
                | NoSuchProviderException | IOException e) {
            e.printStackTrace();
        }
        return "-1";

    }


}
